package zpe.service;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import zpe.controledeacesso.service.EstadoService;
import zpe.controledeacesso.service.LocalidadeService;
import zpe.controledeacesso.service.UsuarioService;
import zpe.genericcrud.service.GenericService;
import zpe.model.Cliente;
import zpe.model.ClienteEmail;
import zpe.model.ClienteUsuario;

@Service(value="clienteService")
public class ClienteService extends GenericService<Cliente> {

	private static final long serialVersionUID = 1L;
	
	@Autowired private EstadoService serviceEstado;
	@Autowired private LocalidadeService serviceLocalidade;
	@Autowired private UsuarioService serviceUsuario;
	@Autowired private @Qualifier("genericService") GenericService<ClienteEmail> serviceClienteEmail;
	@Autowired private @Qualifier("genericService") GenericService<ClienteUsuario> serviceClienteUsuario;
	
	
	@SuppressWarnings("unchecked")
	public List<Cliente> findByCliente( Cliente cliente ){
		DetachedCriteria c  = DetachedCriteria.forClass( Cliente.class )
			.createAlias("usuarios", "u", Criteria.INNER_JOIN)
			.add( Restrictions.eq( "id", cliente.getId() ) );
		
		return getDao().getEntityManager().findByCriteria( c );
	}
	
	
	public GenericService<ClienteEmail> getServiceClienteEmail() {
		return serviceClienteEmail;
	}



	public void setServiceClienteEmail(
			GenericService<ClienteEmail> serviceClienteEmail) {
		this.serviceClienteEmail = serviceClienteEmail;
	}



	public GenericService<ClienteUsuario> getServiceClienteUsuario() {
		return serviceClienteUsuario;
	}



	public void setServiceClienteUsuario(
			GenericService<ClienteUsuario> serviceClienteUsuario) {
		this.serviceClienteUsuario = serviceClienteUsuario;
	}



	public EstadoService getServiceEstado() {
		return serviceEstado;
	}
	public void setServiceEstado(EstadoService serviceEstado) {
		this.serviceEstado = serviceEstado;
	}
	public LocalidadeService getServiceLocalidade() {
		return serviceLocalidade;
	}
	public void setServiceLocalidade(LocalidadeService serviceLocalidade) {
		this.serviceLocalidade = serviceLocalidade;
	}

	public UsuarioService getServiceUsuario() {
		return serviceUsuario;
	}
	public void setServiceUsuario(UsuarioService serviceUsuario) {
		this.serviceUsuario = serviceUsuario;
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Cliente> findTransportadora(Cliente cliente) {
		
		List<Cliente> clientes = null;
		
		if(! "".equalsIgnoreCase( cliente.getDescricao() ) ){
			/*clientes = getDao().getEntityManager().find("from Cliente c order by c.descricao");
		}else{*/
			clientes = getDao().getEntityManager().find("from Cliente c where c.descricao like ? order by c.descricao", "%" +cliente.getDescricao() +"%");
		}
		
		return clientes;
	}

	@SuppressWarnings("unchecked")
	public List<Cliente> findProprietario(Cliente cliente) {
		
		List<Cliente> clientes = null;
		
		if(! "".equalsIgnoreCase( cliente.getCnpj() ) ){
			
			String campoBusca = cliente.getCnpj();
			
			clientes = getDao().getEntityManager().find("from Cliente c where ( c.cnpj like ? or c.descricao like ? ) order by c.descricao", "%" + campoBusca +"%", "%" + campoBusca +"%");
			
		}
		
		return clientes;
	}

	
	
}
